﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once
#include "GcmpModel.h"
#include "UniIdentity.h"

namespace gcmp
{
    class ICategoryLibrary;

    /// \brief 图形样式过滤器
    class GCMP_MODEL_EXPORT ICategoryAndGraphicsStyleFilter
    {
    public:
        /// \brief 获取全局图形样式过滤器
        /// \return 返回全局图形样式过滤器
        static const ICategoryAndGraphicsStyleFilter* GetCategoryAndGraphicsStyleFilter();

        /// \brief 设置全局图形样式过滤器
        /// \param pGraphicsStyleFilter 图形样式过滤器
        static void SetCategoryAndGraphicsStyleFilter(OwnerPtr<ICategoryAndGraphicsStyleFilter> pGraphicsStyleFilter);

        /// \brief 虚拟析构函数
        virtual ~ICategoryAndGraphicsStyleFilter() {};

        // 对一个新建的Document，可配置需要初始化的内建类别     
        virtual bool InitializeBuiltInCategoriesForProject(ICategoryLibrary* pCategoryLibrary) const = 0;
       
        virtual bool InitializeGraphicsStyleAndGraphicsMaterialOfBuiltInCategoriesForProject(IDocument* pDoc)const = 0;

        virtual bool InitializeBuiltInCategoriesForFamily(ICategoryLibrary* pCategoryLibrary) const = 0;

        virtual bool InitializeGraphicsStyleAndGraphicsMaterialOfBuiltInCategoriesForFamily(IDocument* pDoc)const = 0;

        /// \brief 用于“文档级对象样式设置”功能，返回所有需要显示的类别
        /// \param pDoc 文档对象
        /// \return 返回所有需要显示的类别
        virtual std::vector<UniIdentity> GetCategoriesForObjectStyleSetting(const IDocument* pDoc) const = 0;

        /// \brief 获取指定类别的分组名称
        /// \param cateogryUid 类别
        /// \param isFamilyDoc 是否族文档
        /// \return 返回指定类别的分组名称
        virtual std::wstring GetObjectStyleSettingGroupForCategory(const UniIdentity& cateogryUid, bool isFamilyDoc = false) const = 0;

        /// \brief 获取所有可能使用的分组名称
        /// \param isFamilyDoc 是否族文档
        /// \return 返回所有可能使用的分组名称
        virtual std::vector<std::wstring> GetAllObjectStyleSettingGroups(bool isFamilyDoc = false) const = 0; 

        /// \brief 获取使用的分组类别
        /// \param strGroupName 分组名称
        /// \return 返回使用的分组类别
        virtual gcmp::UniIdentity GetVisibiltyFilterGroupRelatedCategory(const std::wstring& strGroupName)const = 0;

        /// \brief 获取是否显示导入对象相关类别的分组
        /// \return 返回true显示导入对象相关类别的分组，否则false
        virtual bool ShowImportedCategoryGroupForObjectStyleSetting() const = 0;

        /// \brief 内部对象样式单独列出，作为一个特殊分组，在发布版中默认不显示
        /// \param pDoc 文档对象
        /// \return 返回内部对象样式类别
        virtual std::vector<UniIdentity> GetInternalCategoriesForObjectStyleSetting(const IDocument* pDoc) const = 0;

        /// \brief 用于“文档级可见性过滤”功能，返回所有需要显示的类别
        /// \param pDoc 文档对象
        /// \return 返回所有需要显示的类别
        virtual std::vector<UniIdentity> GetCategoriesForVisibilityFilter(const IDocument* pDoc) const = 0;

        /// \brief 返回指定类别的分组名称
        /// \param cateogryUid 类别
        /// \return 返回指定类别的分组名称
        virtual std::wstring GetVisibilityFilterGroupForCategory(const UniIdentity& cateogryUid) const = 0;

        /// \brief 返回所有可能使用的分组名称
        /// \return 返回所有可能使用的分组名称
        virtual std::vector<std::wstring> GetAllVisibilityFilterGroups() const = 0;

        /// \brief 用于“文档级拾取过滤”功能，返回所有需要显示的类别
        /// \param pDoc 文档对象
        /// \param isFamilyDoc 是否族文档
        /// \return 返回所有需要显示的类别
        virtual std::vector<std::pair<gcmp::UniIdentity, bool>> GetCategoriesForSelectionFilter(const IDocument* pDoc, bool isFamilyDoc = false) const = 0;

        /// \brief 判断一个类别是否可被平面视图剖切平面剖切
        /// \param categoryUid 类别
        /// \return 返回true表示可以被剖切，否则返回false
        virtual bool IsCuttableCategoryByPlanViewCutPlane(const gcmp::UniIdentity& categoryUid) const = 0;

        /// \brief 判断一个元素是否可被平面视图剖切平面剖切
        /// \param pElement 元素
        /// \return 返回true表示可以被剖切，否则返回false
        virtual bool IsCuttableElementByPlanViewCutPlane(const gcmp::IElement* pElement) const = 0;
    };
}



